package org.leo.myannotation.condition;

import org.springframework.context.annotation.Conditional;

import java.lang.annotation.*;

/**
 * 注解是一个接口，程序可以通过反射获取指定程序元素的Annotation对象
 * 3个元注解：@Target、@Retention、@Documented
 * 常用的注解 @Bean、@AliasFor 其实就是这三个注解的组合
 *
 * RetentionPolicy.RUNTIME: JVM可以获取Annotation信息、程序也可通过反射获取
 * ElementType.TYPE: 指定Annotation可以修饰类、接口（包括注解类型）、枚举
 * ElementType.METHOD: 指定Annotation只能修饰方法
 * 注解 @Document: 标识作用，会被javadoc工具提取成文档
 *
 * 注解 @Inherited 用于饰其他注解，使其被修饰的注解具有继承性
 * 当父类使用的 @Inherited、@Xxx 修饰时，@Xxx 对其子类同样有效
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 固定使用上面三个注解，然后用注解 @Conditional 指定实现类，该类负责编写逻辑
@Conditional(MyCondition.class)
public @interface ConditionalCustom {
    String[] value() default {};
}
